IAP15W413AS工业自动化控制之【14EEPROM实现数据掉电保存】

您所在的位置:网站首页 IAP15W413AS SOP16替代 IAP15W413AS工业自动化控制之【14EEPROM实现数据掉电保存】

IAP15W413AS工业自动化控制之【14EEPROM实现数据掉电保存】

2024-07-11 13:20:47| 来源: 网络整理| 查看: 265

IAP15W413AS工业自动化控制之【14EEPROM实现数据掉电保存】 SingleYork LV5工程师 |      2017-08-23 15:07:40 浏览量 2739 回复:5 本帖最后由 SingleYork 于 2017-9-16 16:44 编辑 bg1.png

在实际应用中,很多时候我们需要对一些设置参数实现掉电保持,以免每次上电都需要重新设置参数,或者产品在运行过程中,需要实时保存一些数据,下次开机后还能查询到。像这种应用场合,就需要用到单片机的EEPROM功能了,当然,也可以用到外部FLASH、EEPROM等芯片,只是,单片机本身自带EEPROM,又何必去另外花钱呢,对吧?

那么,本例笔者就来跟大家介绍一下这款IAP15W413AS控制板的掉电存储功能吧。首先,什么是EEPROM相信大家都应该知道了,不知道的也可以自行百度,毕竟这不是笔者要讲的重点,还是直接切入正题吧,从芯片手册上我们可以知道,IAP15W413AS这款单片机是没有专门的EEPROM的,纳尼?刚才不是说有EEPROM的么?怎么现在又说没有了呢,你是在逗我玩么?哈哈,别急,IAP15W413AS虽然没有专门的EEPROM,但是我们可以将用户程序区的FLASH当EEPROM来使用,也就是说,芯片的存储空间有多大,EEPROM就可以有多大,当然咯,这是比较理想的状况,实际上,我们的程序大小不可能为零,对吧?!

从上面表格中,我们可以知道,IAP15W413AS单片机的EEPROM最多可以分为26个扇区,每个扇区的大小为512个字节,如果我们需要同时操作的数据不大的话,一般只用一个扇区应该就够了,关于这部分详细的知识点,大家可以看芯片手册,笔者在此就不再赘述。本例中,笔者以一个电子钟的程序为例来进行讲解,需要保存的数据就是时、分、秒,很显然只有三个数,一个扇区足矣!那么我们就用使用最后一个扇区吧。

定义扇区的起始地址:

#define IAP_ADDRESS 0x3200 //0x3200-0x33FF 512BYTE

接下来,我们先来实现我们的电子钟程序部分吧,这里其实很简单,用一个定时器就搞定了:

/********************* Timer0中断函数************************/ void timer0_int (void) interrupt TIMER0_VECTOR //1ms { if(Time_EN) { if(++Time_Cnt>=1000)//1000ms { Time_Cnt = 0; Uart1SendEN = 1; //串口发送标志使能 if(++Time_Sec>=60) //60s { Time_Sec = 0; if(++Time_Min>=60) //60Min { Time_Min = 0; if(++Time_Hour>=24) //24Hour { Time_Hour = 0; } } } } } }

其中,Time_EN为计时使能标志,Time_Cnt是用来1ms计数一次,Time_Sec是时间:秒,Time_Min是时间:分,Time_Hour是时间:时,Uart1SendEN是用来使能串口打印数据的,本例钟是1秒串口打印输出1次。程序逻辑很简单,相信有一点基础的基本都能看懂。为了让读者能够看到电子钟实时运行的效果,笔者是通过串口打印的方式来延时的,毕竟板子上也没有装数码管或者液晶屏之类的。

printf("%d:%d:%d\n",Time_Hour,Time_Min,Time_Sec);//串口打印输出时间

在使用printf函数的时候,有一点是特别需要注意的,那就是:在串口初始化的时候,我们需要将TI置1,否则将不能打印输出。关于这点,大家可以自行验证,笔者在此就略过了。

那么,现在我们就要来看数据保存的问题了,如果是要保存到某一秒的话,那么很显然,我们就需要让EEPROM的保存数据间隔小于或至少等于1秒,这样才能做到将时间秒也保存起来。这里顺便说一下,其实还有一种更好的方式,那就是利用单片机的掉电检测功能,搭建掉电检测电路,实现真正的在掉电瞬间进行数据保存。当然,这个就比较复杂了,而且笔者这款板子上也没有专门做这个电路,所以笔者就不在此讲解了,还是用这种比较笨的方式来实现吧。

本例中,笔者是每1秒保存一次数据,利用Uart1SendEN这个标志位来实现打印的同时保存数据:

if(Uart1SendEN) //1秒打印输出一次 { Uart1SendEN = 0; printf("%d:%d:%d\n",Time_Hour,Time_Min,Time_Sec);//串口打印输出时间 EEPROM_SectorErase(IAP_ADDRESS); //扇区擦除,为写EEPROM做准备 EEPROM_Table = Time_Hour/256; EEPROM_Table = Time_Hour%256; EEPROM_Table = Time_Min/256; EEPROM_Table = Time_Min%256; EEPROM_Table = Time_Sec/256; EEPROM_Table = Time_Sec%256; EEPROM_write_n(IAP_ADDRESS,EEPROM_Table,6); //将数据写到EEPROM }

数据保存操作这样就搞定了,那么,我们怎么知道数据到底有没有保存呢?也很简单,在上电的时候从保存的地址位置将数据一一读出来不就好了么?

EEPROM_read_n(IAP_ADDRESS,EEPROM_Table,6); Time_Hour = EEPROM_Table*256 + EEPROM_Table; Time_Min = EEPROM_Table*256 + EEPROM_Table; Time_Sec = EEPROM_Table*256 + EEPROM_Table;

这里需要注意的是,数据的读写操作都是按字节来操作的。所以,在写操作之前,都需要对数据转换成字节,再进行写操作;再读出数据后,也需要将读出来的字节转换成字,因为Time_Hour、Time_Min、Time_Sec都是unsigned int类型。

那么,对EEPROM的读写操作就这样全部搞定了,是不是很简单?我们来看一下运行效果吧,为了区分数据,每次上电的时候都会先打印输出“printf test”:

printf("printf test!\n");//串口打印结果

从上图中我们可以看到,重新上电后,断电前的数据是保存了的。好了,关于IAP15W413AS这款控制板的数据掉电保持功能就介绍到这里了,有一个点笔者需要提醒大家,我们都知道,芯片的擦写次数是有上限的,一般都是在10万次或者100万次,不管是多少次,都意味着他是有寿命的,而我们进行EEPROM写操作的时候,每次都会需要先进行擦除操作,才能成功写入数据,既然这样,如果我们每秒来操作一次EEPROM的话,一天就需要擦写86400次,即使EEPROM的寿命有100万次,也就不到12天就要挂逼了。所以,实际应用中,我们是不允许这么平凡的操作EEPROM的,最理想的方式当然应该是做掉电检测电路来实现真正的掉电保存了,在一些要求不高的场合,也可以适当延长写操作时间间隔、换不同的扇区来实现,这些方法就留给读者去摸索了!

源代码:

本帖最后由 SingleYork 于 2017-9-16 16:44 编辑 bg1.png

在实际应用中,很多时候我们需要对一些设置参数实现掉电保持,以免每次上电都需要重新设置参数,或者产品在运行过程中,需要实时保存一些数据,下次开机后还能查询到。像这种应用场合,就需要用到单片机的EEPROM功能了,当然,也可以用到外部FLASH、EEPROM等芯片,只是,单片机本身自带EEPROM,又何必去另外花钱呢,对吧?

那么,本例笔者就来跟大家介绍一下这款IAP15W413AS控制板的掉电存储功能吧。首先,什么是EEPROM相信大家都应该知道了,不知道的也可以自行百度,毕竟这不是笔者要讲的重点,还是直接切入正题吧,从芯片手册上我们可以知道,IAP15W413AS这款单片机是没有专门的EEPROM的,纳尼?刚才不是说有EEPROM的么?怎么现在又说没有了呢,你是在逗我玩么?哈哈,别急,IAP15W413AS虽然没有专门的EEPROM,但是我们可以将用户程序区的FLASH当EEPROM来使用,也就是说,芯片的存储空间有多大,EEPROM就可以有多大,当然咯,这是比较理想的状况,实际上,我们的程序大小不可能为零,对吧?!

从上面表格中,我们可以知道,IAP15W413AS单片机的EEPROM最多可以分为26个扇区,每个扇区的大小为512个字节,如果我们需要同时操作的数据不大的话,一般只用一个扇区应该就够了,关于这部分详细的知识点,大家可以看芯片手册,笔者在此就不再赘述。本例中,笔者以一个电子钟的程序为例来进行讲解,需要保存的数据就是时、分、秒,很显然只有三个数,一个扇区足矣!那么我们就用使用最后一个扇区吧。

定义扇区的起始地址:

#define IAP_ADDRESS 0x3200 //0x3200-0x33FF 512BYTE

接下来,我们先来实现我们的电子钟程序部分吧,这里其实很简单,用一个定时器就搞定了:

/********************* Timer0中断函数************************/ void timer0_int (void) interrupt TIMER0_VECTOR //1ms { if(Time_EN) { if(++Time_Cnt>=1000)//1000ms { Time_Cnt = 0; Uart1SendEN = 1; //串口发送标志使能 if(++Time_Sec>=60) //60s { Time_Sec = 0; if(++Time_Min>=60) //60Min { Time_Min = 0; if(++Time_Hour>=24) //24Hour { Time_Hour = 0; } } } } } }

其中,Time_EN为计时使能标志,Time_Cnt是用来1ms计数一次,Time_Sec是时间:秒,Time_Min是时间:分,Time_Hour是时间:时,Uart1SendEN是用来使能串口打印数据的,本例钟是1秒串口打印输出1次。程序逻辑很简单,相信有一点基础的基本都能看懂。为了让读者能够看到电子钟实时运行的效果,笔者是通过串口打印的方式来延时的,毕竟板子上也没有装数码管或者液晶屏之类的。

printf("%d:%d:%d\n",Time_Hour,Time_Min,Time_Sec);//串口打印输出时间

在使用printf函数的时候,有一点是特别需要注意的,那就是:在串口初始化的时候,我们需要将TI置1,否则将不能打印输出。关于这点,大家可以自行验证,笔者在此就略过了。

那么,现在我们就要来看数据保存的问题了,如果是要保存到某一秒的话,那么很显然,我们就需要让EEPROM的保存数据间隔小于或至少等于1秒,这样才能做到将时间秒也保存起来。这里顺便说一下,其实还有一种更好的方式,那就是利用单片机的掉电检测功能,搭建掉电检测电路,实现真正的在掉电瞬间进行数据保存。当然,这个就比较复杂了,而且笔者这款板子上也没有专门做这个电路,所以笔者就不在此讲解了,还是用这种比较笨的方式来实现吧。

本例中,笔者是每1秒保存一次数据,利用Uart1SendEN这个标志位来实现打印的同时保存数据:

if(Uart1SendEN) //1秒打印输出一次 { Uart1SendEN = 0; printf("%d:%d:%d\n",Time_Hour,Time_Min,Time_Sec);//串口打印输出时间 EEPROM_SectorErase(IAP_ADDRESS); //扇区擦除,为写EEPROM做准备 EEPROM_Table = Time_Hour/256; EEPROM_Table = Time_Hour%256; EEPROM_Table = Time_Min/256; EEPROM_Table = Time_Min%256; EEPROM_Table = Time_Sec/256; EEPROM_Table = Time_Sec%256; EEPROM_write_n(IAP_ADDRESS,EEPROM_Table,6); //将数据写到EEPROM }

数据保存操作这样就搞定了,那么,我们怎么知道数据到底有没有保存呢?也很简单,在上电的时候从保存的地址位置将数据一一读出来不就好了么?

EEPROM_read_n(IAP_ADDRESS,EEPROM_Table,6); Time_Hour = EEPROM_Table*256 + EEPROM_Table; Time_Min = EEPROM_Table*256 + EEPROM_Table; Time_Sec = EEPROM_Table*256 + EEPROM_Table;

这里需要注意的是,数据的读写操作都是按字节来操作的。所以,在写操作之前,都需要对数据转换成字节,再进行写操作;再读出数据后,也需要将读出来的字节转换成字,因为Time_Hour、Time_Min、Time_Sec都是unsigned int类型。

那么,对EEPROM的读写操作就这样全部搞定了,是不是很简单?我们来看一下运行效果吧,为了区分数据,每次上电的时候都会先打印输出“printf test”:

printf("printf test!\n");//串口打印结果

从上图中我们可以看到,重新上电后,断电前的数据是保存了的。好了,关于IAP15W413AS这款控制板的数据掉电保持功能就介绍到这里了,有一个点笔者需要提醒大家,我们都知道,芯片的擦写次数是有上限的,一般都是在10万次或者100万次,不管是多少次,都意味着他是有寿命的,而我们进行EEPROM写操作的时候,每次都会需要先进行擦除操作,才能成功写入数据,既然这样,如果我们每秒来操作一次EEPROM的话,一天就需要擦写86400次,即使EEPROM的寿命有100万次,也就不到12天就要挂逼了。所以,实际应用中,我们是不允许这么平凡的操作EEPROM的,最理想的方式当然应该是做掉电检测电路来实现真正的掉电保存了,在一些要求不高的场合,也可以适当延长写操作时间间隔、换不同的扇区来实现,这些方法就留给读者去摸索了!

源代码:

0 收藏 举报 分享 × 微信分享 扫描二维码分享 qq分享 QQ空间分享 微博分享


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭